/*
 * Copyright (C) 2015 RederXu
 *	本程序不保证完全正确，由于引用本程序导致的一切损失本人概不负责。
 *	有任何请疑问邮件至xujianflying@sohu.com
 */
package com.rederxu.jdbc;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import com.rederxu.request.HTTPRequest;
import com.rederxu.request.onRequestOverListener;

/***
 * @author RederXu
 * @date 2015-9-17
 * <h1>用以连接和操作MySQL数据库，后台使用php建立取数据的通用接口实现</h1>
 * 1.需要权限<h1>&nbsp;&nbsp;&nbsp;&nbsp;android.permission.INTERNET</h1>
 * 2.暂不支持事务（2015/9/17）<br/> 
 * 3.MySQL服务器需要允许非localhost访问，MySQL命令行中执行以下命令即可<br/> 
 * 		<h1>&nbsp;&nbsp;&nbsp;&nbsp;1)登录mysql:mysql -u root -pvmwaremysql>use mysql;</h1>
 * 		<h1>&nbsp;&nbsp;&nbsp;&nbsp;2)update user set host = '%' where user ='root';</h1>
 * 		<h1>&nbsp;&nbsp;&nbsp;&nbsp;3)select host, user from user;</h1>
 * 		<h1>&nbsp;&nbsp;&nbsp;&nbsp;4)flush privileges;</h1>
 * 4.有疑问邮件至xujianflying@sohu.com
 * */
public class MySQL{

	private String host = null;
	private String username = null;
	private String password = null;
	private String database = null;
	private final String phpHelperUrl = "http://192.168.1.174:8020/farmer/mysql.php";
	private final String TAG = "MySQL";
	
	/**
	 * MySQL类构造器
	 * @author RederXu
	 * @date 2015-9-17
	 * @param host=>servername，默认端口为3306，端口有修改请写为localhost:xxxx样子
	 * @param database=>选中的数据库
	 * @param username=>数据库用户名，mysql默认为root
	 * @param password=>数据库用密码，mysql默认为root
	 * 
	 * */
	public MySQL(String host,String database,String username,String password){
		this.host = host;
		this.username = username;
		this.password = password;
		this.database = database;
	}

	/**
	 * 要求返回值的查询语句执行，通常为select
	 * @author RederXu
	 * @date 2015-9-17
	 * @param sql,需要执行的sql语句
	 * @param MySQLExceteQueryListener，用以回调的监听，最好在UI线程中初始化，会避免一些问题.查询结束后触发onExceteOver.查询失败onExceteOver传入null
	 * */
	public void execteQuery(Context context,String sql,final MySQLExceteQueryListener listener){
		Bundle bundle = new Bundle();
		bundle.putString("host", host);
		bundle.putString("username", username);
		bundle.putString("password", password);
		bundle.putString("database", database);
		bundle.putString("sql", sql);
		bundle.putString("action", "query");
		//使用POST更安全
		HTTPRequest.POST(context,phpHelperUrl, bundle, new onRequestOverListener() {
			
			@Override
			public void onRequestOver(String result) {
				try{
					JSONObject jo = new JSONObject(result);
					if(jo.getBoolean("status")){
						JSONArray ja = jo.getJSONArray("message");
						List<Bundle> listBundle = new ArrayList<Bundle>();
						for(int i = 0; i < ja.length();i++){
							jo = ja.getJSONObject(i);
							Bundle bundle = new Bundle();
							Iterator<String> keys = jo.keys();
							while(keys.hasNext()){
								String key = keys.next();
								bundle.putString(key, jo.getString(key));
							}
							listBundle.add(bundle);
						}
						listener.onExceteOver(listBundle);
					}else{
						Log.e(TAG, jo.getString("message"));
						listener.onExceteOver(null);
					}
				}catch(JSONException e){
					Log.e("result", result);
					Log.e(TAG, e.toString());
				}
			}
		});
	}
	

	/**
	 * 执行SQL命令
	 * @author RederXu
	 * @date 2015-9-17
	 * @param sql,需要执行的sql语句
	 * @param MySQLExceteListener，用以回调的监听，最好在UI线程中初始化，会避免一些问题.
	 * 		查询结束后触发onExceteOver,onExceteOver的内容为JSONObject.当status为true即为查询成功
	 * */
	public void execte(Context context,String sql,final MySQLExceteListener listener){
		List<String> list = new ArrayList<String>();
		list.add(sql);
		execte(context,list, listener);
	}
	

	/**
	 * 执行SQL命令<h1>暂不支持事务（2015-9-17）</h1>
	 * @author RederXu
	 * @date 2015-9-17
	 * @param sqlList,需要执行的sql语句列表
	 * @param MySQLExceteListener，用以回调的监听，最好在UI线程中初始化，会避免一些问题.
	 * 		查询结束后触发onExceteOver,onExceteOver的内容为JSONObject.当status为true即为查询成功
	 * */
	public void execte(Context context,List<String> sqlList,final MySQLExceteListener listener){

		JSONArray ja = new JSONArray();
		for(String sql : sqlList){
			ja.put(sql);
		}
		if(ja.length() == 0){
			Log.e(TAG, "没有sql语句");
			return;
		}
		Bundle bundle = new Bundle();
		bundle.putString("host", host);
		bundle.putString("username", username);
		bundle.putString("password", password);
		bundle.putString("database", database);
		bundle.putString("sql", ja.toString());
		bundle.putString("action", "execute");
		HTTPRequest.POST(context,phpHelperUrl, bundle, new onRequestOverListener() {
			
			@Override
			public void onRequestOver(String result) {
				listener.onExceteOver(result);
			}
		});
	}
}
